|
|
- namespace VRTK.Examples
- {
- using UnityEngine;
- using UnityEngine.UI;
-
- public class PanelMenuSaucerGrid : MonoBehaviour
- {
- public GridLayoutGroup gridLayoutGroup;
- public MeshRenderer changeObject;
- public VRTK_PanelMenuItemController panelMenuController;
- public Color[] colours = new Color[0];
-
- protected int currentIndex = 0;
- protected readonly Color colorDefault = Color.white;
- protected readonly Color colorSelected = Color.green;
- protected readonly float colorAlpha = 0.25f;
- protected enum Direction
- {
- None,
- Up,
- Down,
- Left,
- Right
- }
-
- protected virtual void OnEnable()
- {
- if (panelMenuController != null)
- {
- panelMenuController.PanelMenuItemSwipeTop += PanelMenuItemSwipeTop;
- panelMenuController.PanelMenuItemSwipeBottom += PanelMenuItemSwipeBottom;
- panelMenuController.PanelMenuItemSwipeLeft += PanelMenuItemSwipeLeft;
- panelMenuController.PanelMenuItemSwipeRight += PanelMenuItemSwipeRight;
- panelMenuController.PanelMenuItemTriggerPressed += PanelMenuItemTriggerPressed;
- }
-
- SetGridLayoutItemSelectedState(currentIndex);
- }
-
- protected virtual void PanelMenuItemTriggerPressed(object sender, PanelMenuItemControllerEventArgs e)
- {
- if (currentIndex < colours.Length && changeObject != null)
- {
- changeObject.material.color = colours[currentIndex];
- }
- }
-
- protected virtual void PanelMenuItemSwipeRight(object sender, PanelMenuItemControllerEventArgs e)
- {
- MoveSelectGridLayoutItem(Direction.Right);
- }
-
- protected virtual void PanelMenuItemSwipeLeft(object sender, PanelMenuItemControllerEventArgs e)
- {
- MoveSelectGridLayoutItem(Direction.Left);
- }
-
- protected virtual void PanelMenuItemSwipeBottom(object sender, PanelMenuItemControllerEventArgs e)
- {
- MoveSelectGridLayoutItem(Direction.Down);
- }
-
- protected virtual void PanelMenuItemSwipeTop(object sender, PanelMenuItemControllerEventArgs e)
- {
- MoveSelectGridLayoutItem(Direction.Up);
- }
-
- protected virtual void SetGridLayoutItemSelectedState(int index)
- {
- foreach (Transform childTransform in gridLayoutGroup.transform)
- {
- GameObject child = childTransform.gameObject;
- if (child != null)
- {
- Color color = colorDefault;
- color.a = colorAlpha;
- child.GetComponent<Image>().color = color;
- }
- }
-
- Transform selected = gridLayoutGroup.transform.GetChild(index);
- if (selected != null)
- {
- Color color = colorSelected;
- color.a = colorAlpha;
- selected.GetComponent<Image>().color = color;
- }
- }
-
- protected virtual bool MoveSelectGridLayoutItem(Direction direction)
- {
- int newIndex = FindNextItemBasedOnMoveDirection(direction);
- if (newIndex != currentIndex)
- {
- SetGridLayoutItemSelectedState(newIndex);
- currentIndex = newIndex;
- }
- return true;
- }
-
- protected virtual int FindNextItemBasedOnMoveDirection(Direction direction)
- {
- float width = gridLayoutGroup.preferredWidth;
- float cellWidth = gridLayoutGroup.cellSize.x;
- float spacing = gridLayoutGroup.spacing.x;
- int cellsAccross = (int)Mathf.Floor(width / (cellWidth + (spacing / 2))); // quick / dirty
- int childCount = gridLayoutGroup.transform.childCount;
-
- switch (direction)
- {
- case Direction.Up:
- int nextUp = currentIndex - cellsAccross;
- return (nextUp >= 0) ? nextUp : currentIndex;
- case Direction.Down:
- int nextDown = currentIndex + cellsAccross;
- return (nextDown < childCount) ? nextDown : currentIndex;
- case Direction.Left:
- int nextLeft = currentIndex - 1;
- return (nextLeft >= 0) ? nextLeft : currentIndex;
- case Direction.Right:
- int nextRight = currentIndex + 1;
- return (nextRight < childCount) ? nextRight : currentIndex;
- default:
- return currentIndex;
- }
- }
- }
- }
|